
/**
 * 将分转换为元（不格式化）
 * @param {number} cents - 金额（分）
 * @returns {number} 金额（元）
 */
/**
 * 将分转换为元（支持四舍五入）
 * @param {number|string} cents - 金额（分），支持数字和字符串
 * @param {number} [precision=2] - 保留小数位数（默认2位）
 * @param {boolean} [round=true] - 是否进行四舍五入
 * @returns {number} 金额（元）
 */
export const centsToYuan = (cents: Number | string, precision = 2, round = true) => {
    // 处理空值
    if (cents === null || cents === undefined || cents === '') {
        return 0;
    }

    // 转换为数字
    let numericValue;
    if (typeof cents === 'string') {
        // 移除千分位分隔符和非数字字符（保留负号和小数点）
        const cleaned = cents.replace(/[^\d.-]/g, '');
        numericValue = parseFloat(cleaned);
    } else {
        numericValue = Number(cents);
    }

    // 处理无效数字
    if (isNaN(numericValue)) {
        return 0;
    }

    // 转换为元
    let yuan = numericValue / 100;

    // 四舍五入处理
    if (round) {
        // 使用指数法避免浮点数精度问题
        const factor = Math.pow(10, precision);
        yuan = Math.round(yuan * factor) / factor;
    }

    return yuan;
};

/**
 * 将元转换为分（支持四舍五入）
 * @param {number|string} yuan - 金额（元），支持数字和字符串
 * @param {boolean} [round=true] - 是否进行四舍五入
 * @returns {number} 金额（分）
 */
export const yuanToCents = (yuan: number | string, round = true) => {
    // 处理空值
    if (yuan === null || yuan === undefined || yuan === '') {
        return 0;
    }

    // 转换为数字
    let numericValue;
    if (typeof yuan === 'string') {
        // 移除千分位分隔符和非数字字符（保留负号和小数点）
        const cleaned = yuan.replace(/[^\d.-]/g, '');
        numericValue = parseFloat(cleaned);
    } else {
        numericValue = Number(yuan);
    }

    // 处理无效数字
    if (isNaN(numericValue)) {
        return 0;
    }

    // 转换为分
    let cents = numericValue * 100;

    // 四舍五入处理
    if (round) {
        // 使用Math.round确保精确四舍五入到整数分
        cents = Math.round(cents);
    }

    return cents;
};


export function parseQueryString(url: string): Record<string, string> {
    let arr;
    const res: Record<string, string> = {};
    url = url.split('#')[0];
    arr = url.split('?');
    arr.shift();
    let queryStr = arr.join('?');
    if (queryStr.trim().length === 0) {
        return res;
    }
    arr = queryStr.split('&');
    for (let i = 0; i < arr.length; i++) {
        var itemArr = arr[i].split('=');
        var name = itemArr.shift();
        var value = itemArr.join('=');
        if (name) {
            res[name] = value;
        }
    }
    return res;
}

export const commonUtils = {
    formatPhone: function (e: string) {
        return e && e.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2")
    },
    toTop: function () {
        document.documentElement.scrollIntoView({
            behavior: "smooth",
            block: "start"
        })
    },
    formatTimeStr: function (e: string) {
        if (!e || "string" !== typeof e)
            return "";
        var t = e.replace(/-/g, "/")
            , i = new Date(t).getTime();
        return i
    },
    calScrollHeaderRadio: (
        scrollTop: number, 
        bannerHeight: number, 
        headerFadeRadio: { start: number, end: number }): number => {
        if (scrollTop == null || scrollTop === undefined) {
            scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
        }
        if (headerFadeRadio === null) {
            headerFadeRadio = {
                start: .65,
                end: .78
            }
        }
        let i = Number(0);
        if (scrollTop <= bannerHeight * headerFadeRadio.start) {
            i = 0;
        } else if (scrollTop <= bannerHeight * headerFadeRadio.end) {
            const d = ((scrollTop - bannerHeight * headerFadeRadio.start) /
                (bannerHeight * (headerFadeRadio.end - headerFadeRadio.start))).toFixed(3)
            i = Math.min(Number(d), 1);
        } else {
            i = 1;
        }
        return i;
    }
}